// pages/consultation/consultation.js
const request = require('../../utils/promise.js');
const app = getApp();

var systemInfo = wx.getSystemInfoSync();
var windowWidth = systemInfo.windowWidth; // 内容可视区域宽度
var windowHeight = systemInfo.windowHeight; // 内容可视区域高度
var Px2Ppx = 750 / windowWidth; // px转换到rpx的比例
var rpxScrollHeight = windowHeight * Px2Ppx - 100; // 初始化消息滚动内容高度
var keyHeight = 0;

Page({

  /**
   * 页面的初始数据
   */
  data: {
    authModal: false,   // 授权弹窗
    userId: -1,
    username: '',
    avatarUrl: '',
    inputVal: '', // 消息输入文本
    msgList: [], // 历史消息集合
    preLineCount: 1, // 多文本上的行数
    avgLineRpxHeight: 0, // 多文本每一行平均高度
    scrollHeight: rpxScrollHeight, // 消息区域滚动条高度
    inputBottom: 0
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    // 每次进入页面，初始化聊天信息
    this.initData();

    // 检测是否登录, 未登录再次登录
    if (!wx.getStorageSync('openId')) {
      wx.login({
        success: res => {
          // 发送 res.code 到后台换取 openId，以及基础用户信息
          if (res.code) {
            request.GET("/user/onLogin/code2Session", {code: res.code}).then(res => {
              console.log('再次登录获取 openId: ', res)
              if (res.data && res.data.success) {
                wx.setStorageSync('userId', res.data.userId); // 缓存用户id，如果第一次注册是id为-1
                wx.setStorageSync('username', res.data.username); // 缓存昵称, 如果第一次注册时为空
                wx.setStorageSync('avatarUrl', res.data.avatarUrl); // 缓存用户头像, 如果第一次注册时默认灰色头像
                wx.setStorageSync('openId', res.data.openId); // 缓存用户
                
                // 页面变量赋值
                this.setData({
                  userId: res.data.userId,
                  username: res.data.username,
                  avatarUrl: res.data.avatarUrl
                })
              }
            })
          }
        }
      })
    } else {
      // 获取用户信息
      request.GET('/user/userInfo', {userId: wx.getStorageSync('userId')}).then(res => {
        let id = -1;
        let username = '';
        let avatarUrl = '';
        if (res.data.resCode==200) {
          id = res.data.userInfo['id'];
          username = res.data.userInfo['username'];
          avatarUrl = res.data.userInfo['avatarUrl'];
        }

        this.setData({
          userId: id,
          username: username,
          avatarUrl: avatarUrl
        })
      })
    }

    // websocket 对象有可能为 {} 或者 状态为0表示正在连接中
    let nowState = app.globalData.oaSocketTask.readyState;
    if (nowState != 1 && nowState != 0) {
      // 尝试初始化连接
      app.initSocketTask();

      wx.showLoading({
        title: '加载中',
      });
      // 微信小程序切后台，之后直接再回到聊天页 （其中app中创建与打开socket属于异步，使用定时器延迟处理，来确保socket基本处于open状态）
      setTimeout(() => {
        // 定时隐藏加载框
        wx.hideLoading();
      }, 1500);
    }

    // let data = {}
    // data.sendId = wx.getStorageSync('userId');
    // data.sendUsername = wx.getStorageSync('username');
    // data.sendUserAvatarPath = wx.getStorageSync('avatarUrl');
    // data.messageType = '3';
    // //data.message = '只是为了简单的测试一下，\n看看是否就是我想要的结果，这个功能是否正常？';
    // data.message = '这个问题是还是十分简单的啦';

    // app.globalData.oaSocketTask.send({
    //   data: JSON.stringify(data)
    // });

  },
  /**
   * 初始化数据
   */
  initData() {
    // 加载最近的100条 历史聊天记录
    request.GET('/redis/getWorldChannelLast100Msg', {}).then(res => {
      if (res.statusCode==200) {
        this.setData({
          msgList:res.data
        });

        this.setData({
          toView: 'msg-' + (this.data.msgList.length - 1)
        });
      }
    })
  },
  /**
   * webSocket 消息回调函数
   */
  oaOnMessage(res){
    let data = JSON.parse(res.data);

    let newMsgList = this.data.msgList;
    let len = newMsgList.push(data);
    // 暂时，最多保留100条数据，避免超过1024KB赋值上限
    if(len > 100){
      newMsgList.shift();
    }
    // 重新赋值
    this.setData({
      msgList:newMsgList,
    });

    // 自己发送的消息，则消息区域定位到 最底部
    if(this.data.userId == data.sendId){
      this.setData({
        toView: 'msg-' + (len - 1)
      });
    }
  },
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },
  /** 
   * 页面被用户分享时执行
   */ 
  onShareAppMessage() {

  },
  /** 
   * 分享到朋友圈
   */
  onShareTimeline() {
    
  },
  /**
   * 点击显示微信授权
   */
  clickShowAuthModal() {
    this.setData({
      authModal: true
    })
  },
  /**
   * 点击拒绝微信授权
   */
  refuseHideAuthModal() {
    this.setData({
      authModal: false
    })
  },
  /**
   * 授权获取用户信息
   */
  getUserProfile(e) {
    // 该授权方式弃用，由于该模块没有开放使用，该函数代码注释处理。 wjc 2022-11-25

    // wx.showToast({
    //   title: '授权中',
    //   icon: 'loading',
    //   duration: 1000,
    //   mask: true,
    // })

    // if (wx.getStorageSync('openId')) {
    //   wx.getUserProfile({
    //     lang: 'zh_CN',
    //     desc: '展示用户信息', // 声明获取用户个人信息后的用途，后续会展示在弹窗中，请谨慎填写
    //     success: (res) => {
    //       wx.showToast({
    //         title: '登录中',
    //         icon: 'loading',
    //         duration: 30000,
    //         mask: true
    //       })

    //       const param = {openId: wx.getStorageSync('openId'), userInfoStr: JSON.stringify(res.userInfo)};
    //       request.GET('/user/authRegister', param).then(result => {
    //         // console.log(result)
    //         if (result.data.resCode==200) {
    //           wx.showToast({
    //             title: '授权登录成功',
    //             icon: 'success',
    //             duration: 1000,
    //             mask: true
    //           })

    //           // 缓存昵称、用户id、用户头像
    //           wx.setStorageSync('userId', result.data.userInfo['id']); // 缓存用户 id
    //           wx.setStorageSync('username', result.data.userInfo['username']); // 缓存昵称, 第一次注册时为空
    //           wx.setStorageSync('avatarUrl', result.data.userInfo['avatarUrl']); // 缓存用户头像, 如果第一次注册时默认灰色头像

    //           // 页面变量赋值
    //           this.setData({
    //             authModal: false,
    //             userId: result.data.userInfo['id'],
    //             username: result.data.userInfo['username'],
    //             avatarUrl: result.data.userInfo['avatarUrl']
    //           })
              
    //           // 初始化连接
    //           app.initSocketTask();

    //         } else {
    //           wx.showToast({
    //             title: '授权登录异常',
    //             icon: 'error',
    //             mask: true
    //           })
    //         }
    //       })
    //     }
    //   })
    // }
  },

  /**
   * 获取聚焦
   */
  inputFocus: function(e) {
    keyHeight = e.detail.height;
    
    // 状态栏的高度
    let rpxStatusHeight = systemInfo.statusBarHeight * Px2Ppx
    // 导航栏的高度
    let rpxNavHeight = 44 * Px2Ppx
    // 内容区的高度
    let rpxWindowHeight = systemInfo.windowHeight * Px2Ppx
    // 屏幕的高度
    let rpxScreentHeight = systemInfo.screenHeight * Px2Ppx
    // 底部tabBar的高度
    let tabBarHeight = rpxScreentHeight - rpxStatusHeight - rpxNavHeight - rpxWindowHeight
    this.setData({
      inputBottom: (keyHeight * Px2Ppx - tabBarHeight),
    })

    if(this.data.preLineCount==3){
      // 之前已经有3行文本
      this.setData({
        scrollHeight: (rpxWindowHeight - (keyHeight * Px2Ppx) - this.data.avgLineRpxHeight),
      })
    }else if(this.data.preLineCount>=4){
      // 之前已经有大于等于4行文本
      this.setData({
        scrollHeight: (rpxWindowHeight - (keyHeight * Px2Ppx) - (this.data.avgLineRpxHeight*2)),
      })
    }else{
      // 正常情况的高度
      this.setData({
        scrollHeight: (rpxWindowHeight - keyHeight * Px2Ppx),
      })
    }

    this.setData({
      toView: 'msg-' + (this.data.msgList.length - 1)
    });
  },

  //失去聚焦(软键盘消失)
  hideInput: function(e) {
    if(this.data.preLineCount==3){
      this.setData({
        inputBottom: 0,
        scrollHeight: rpxScrollHeight-this.data.avgLineRpxHeight,
      })
    }else if(this.data.preLineCount>=4){
      this.setData({
        inputBottom: 0,
        scrollHeight: rpxScrollHeight-this.data.avgLineRpxHeight*2,
      })
    }else{
      this.setData({
        inputBottom: 0,
        scrollHeight: rpxScrollHeight,
      })
    }

    this.setData({
      toView: 'msg-' + (this.data.msgList.length - 1)
    });
  },
  /**
   * 多文本框，多行高度变化，消息区域高度动态调整
   */
  lineChange: function(e){
    let nowLineCount = e.detail.lineCount;
    let nowPreLineCount = this.data.preLineCount;
    let nowScrollHeight = this.data.scrollHeight;
    let nowAvgLineRpxHeight = this.data.avgLineRpxHeight;

    // 目前页面布局最大高度，支持4行文本。消息区域高度需要动态调整
    if(nowLineCount == 1 || nowLineCount == 2){
      // 取第一行高度，作为平均行高度
      if(nowLineCount == 1){
        this.setData({
          avgLineRpxHeight:e.detail.heightRpx
        });
      }

      // 之前是大于2行以上
      if(nowPreLineCount > 2){
        // 消息区域，高度增加
        let multiple = nowPreLineCount-2>=2?2:1;
        this.setData({
          scrollHeight: (nowScrollHeight + nowAvgLineRpxHeight*multiple),
        })
        this.setData({
          toView: 'msg-' + (this.data.msgList.length - 1)
        });
      }
    }else if(nowLineCount == 3){
      // 消息区域，高度增加
      if(nowPreLineCount > 3){
        this.setData({
          scrollHeight: (nowScrollHeight + nowAvgLineRpxHeight),
        })
        this.setData({
          toView: 'msg-' + (this.data.msgList.length - 1)
        });
      }else if(nowPreLineCount < 3){
        // 消息区域，高度降低
        this.setData({
          scrollHeight: (nowScrollHeight - nowAvgLineRpxHeight),
        })
        this.setData({
          toView: 'msg-' + (this.data.msgList.length - 1)
        });
      }
    }else if(nowLineCount >= 4){
      // 消息区域，高度降低
      if(nowPreLineCount < 4){
        let multiple = 4-nowPreLineCount>1?2:1;
        this.setData({
          scrollHeight: (nowScrollHeight - nowAvgLineRpxHeight*multiple),
        })
        this.setData({
          toView: 'msg-' + (this.data.msgList.length - 1)
        });
      }
    }
    
    // 设置多文本，目前行数
    this.setData({
      preLineCount:nowLineCount
    });
  },
  /**
   * 消息框输入事件，实时获取value
   */
  msgBindInput:function(e){
    this.setData({
      inputVal:e.detail.value
    })
  },

  /**
   * 发送消息
   */
  sendClick: function(e) {
    if(this.data.inputVal.trim() == ''){
      wx.showToast({
        icon: 'none',
        title: '请输入对话内容',
      })
      return;
    }

    /**
     * 当 WebSocket 状态为 连接状态 或 打开时，才允许发送消息
     * 状态 {"CONNECTING":0,"OPEN":1,"CLOSING":2,"CLOSED":3}
     */
    if (app.globalData.oaSocketTask.readyState == 1) {
      let data = {}
      data.sendId = wx.getStorageSync('userId');
      data.sendUsername = wx.getStorageSync('username');
      data.sendUserAvatarPath = wx.getStorageSync('avatarUrl');
      data.messageType = '3';
      data.message = this.data.inputVal;

      app.globalData.oaSocketTask.send({
        data: JSON.stringify(data)
      });
      
      // 清空输入框消息内容
      this.setData({
        inputVal:''
      });

    } else {
      wx.showToast({
        icon: 'none',
        title: '发送失败，请稍后重试',
      })
    }
  },


})